from collections import OrderedDict

from apps.goods.models import GoodsChannel, GoodsCategory


def get_category():
    #定义一个有序字典对象
    categories=OrderedDict()
    #对GoodsChannel 进行 group_id和 sequence排序，获取排序后的结果
    channels=GoodsChannel.objects.order_by('group_id','sequence')

    #遍历排序后的结果： 得到所有的一级菜单（频道 ）
    for channel in channels:
        #从频道中得到当前的 组id
        group_id=channel.group_id

        #判断： 如果当前组id 不在我们的有序字典中
        if group_id not in categories:
            #我们就把 组id 添加到有序字典中
            #并且作为 key值, value值 是 {'channels': [], 'sub_cats': []}
            categories[group_id]={
                'channels':[],
                'sub_cats':[]
            }
        #获取当前频道的分类名称
        cat1=channel.category
        # 给刚刚创建的字典中, 追加具体信息:
        # 即, 给'channels' 后面的 [] 里面添加如下的信息:
        categories[group_id]['channels'].append({
            'id': cat1.id,
            'name': cat1.name,
            'url': channel.url,
        })
        #根据cat1的外键反向，获取下一级(二级菜单)的所有分类数据，并遍历
        cat2s=GoodsCategory.objects.filter(parent=cat1) #应该是id
        for cat2 in cat2s:
            #创建一个新的列表 ,就类似chird 二级分类
            cat2.sub_cats=[]
            cat3s=GoodsCategory.objects.filter(parent=cat2)
            #根据cat2的外键反向 ，获取下一级（三级菜单）的所有分类数据，并遍历：
            for cat3 in cat3s:
                #拼接新的列表：key ：二级菜单名称，value: 三级菜单组成的列表
                cat2.sub_cats.append(cat3)
            #所有内容在增加到一级菜单生成的有序字典中去
            categories[group_id]['sub_cats'].append(cat2)

    return categories

"""
 面包屑
"""
def get_breadcrumb(category):
    """接收最低级别的类别 ， 获取各个类别的名称，返回"""
    dict={
        'cat1':'',
        'cat2':'',
        'cat3':''
    }
    if category.parent is None:
        dict['cat1']=category.name
    elif category.parent.parent is None:
        dict['cat2']=category.name
        dict['cat1']=category.parent.name
    else:
        dict['cat3']=category.name
        dict['cat2']=category.parent.name
        dict['cat1']=category.parent.parent.name

    return dict

"""
  规格选项
"""
def get_goods_specs(sku):
    #构建当前商品的规格键
    sku_specs= sku.specs.order_by('spec_id')
    sku_key=[]
    for spec in sku_specs:
        #sku的 id
        sku_key.append(spec.option.id)

    #获取当前商品的所有SKU   SPU外键
    skus=sku.spu.sku_set.all()
    #构建不同规格参数（选项） 的SKU字典
    spec_sku_map={}
    for s in skus:
        #获取sku的参数规格
        s_specs=s.specs.order_by('spec_id')
        #用于形成规格参数-sku字典的键
        key=[]
        for spec in s_specs:
            key.append(spec.option.id)
        #向规格参数 - SKU字典添加记录
        spec_sku_map[tuple(key)]=s.id
    #以下代码为： 在每个选项上绑定对的sku_id值
    #获取当前的商品的规格信息 , 构造返回的数据
    goods_specs=sku.spu.specs.order_by('id')
    #若当前sku的规格信息不完整，则不在继续
    if len(sku_key)< len(goods_specs):
        return
    # enumerate  enumerate() 是 Python 的一个内置函数，用于在遍历可迭代对象（如列表、元组、字符串等）时，同时获取元素的索引（位置）和值。 有些类似java中 itetor迭代器
    for index,spec in enumerate(goods_specs):
        #复制 当前 sku 的规格键
        key=sku_key[:] #列的推导式
        #该规格的选项
        spec_options=spec.options.all()
        for option in spec_options:
            #在规格参数sku字典中查找符合当前规格的sku
            key[index]=option.id
            #spec_sku_map[tuple(key)]
            option.sku_id=spec_sku_map.get(tuple(key))  #spec_sku_map[tuple(key)] , 类似java中的
        spec.spec_options=spec_options# map  构造数据

    return goods_specs